package com.iiot.sys;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 全局计数器，用于统计各类事件和性能指标
 * 线程安全
 */
public class PerformanceCollect {
    // 使用 ConcurrentHashMap + AtomicLong 保证线程安全
    private static final Map<String, AtomicLong> counters = new ConcurrentHashMap<>();

    /**
     * 增加指定键的计数值
     *
     * @param key   指标名称，如 "parserCount", "Exception"
     * @param delta 增量，可为负数
     */
    public static void add(String key, long delta) {
        counters.computeIfAbsent(key, k -> new AtomicLong(0)).addAndGet(delta);
    }

    /**
     * 获取指定键的当前值
     *
     * @param key 指标名称
     * @return 当前值，若不存在返回 0
     */
    public static long get(String key) {
        AtomicLong counter = counters.get(key);
        return counter != null ? counter.get() : 0L;
    }

    /**
     * 获取所有计数器的快照（用于监控/日志输出）
     *
     * @return 不可变快照
     */
    public static Map<String, Long> getAll() {
        Map<String, Long> snapshot = new ConcurrentHashMap<>();
        for (Map.Entry<String, AtomicLong> entry : counters.entrySet()) {
            snapshot.put(entry.getKey(), entry.getValue().get());
        }
        return snapshot;
    }

    /**
     * 重置指定计数器
     */
    public static void reset(String key) {
        AtomicLong counter = counters.get(key);
        if (counter != null) {
            counter.set(0);
        }
    }

    /**
     * 重置所有计数器（谨慎使用）
     */
    public static void resetAll() {
        for (AtomicLong counter : counters.values()) {
            counter.set(0);
        }
    }

    /**
     * 获取并重置指定计数器（类似“取走当前值并清零”）
     */
    public static long getAndReset(String key) {
        AtomicLong counter = counters.get(key);
        return counter != null ? counter.getAndSet(0) : 0L;
    }
}
